﻿using Shinva.LADModel.Abstractions;
using Shinva.LADModel.Models;
using Shinva.Variables.Interface;
using Shinva.Variables.Models;
using Shinva.Variables.Type.bit;
using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Documents;
using static System.Net.Mime.MediaTypeNames;

namespace Shinva.LADModel.Helper
{
    public class ConnectInfo
    {
        public INode node;
    }
    public static class WireConnector
    {


        public static void Connect(Powerrail net,List<(IGraphNode node, string name)> list)
        {
            if (list[0].node is Powerrail pn)
            {
                for (int i = 1; i < list.Count; i++)
                    net.Connect((ElementNodeBase)list[i].node, "Powerrail", list[i].name);
            }else if (IsContainDataPointer(list))
            {//如果包含数据指针，那么就需要进行赋值操作，并且元素就两个，并且不需要建立Connector
 

                if (list[0].node is DataPointer dp && list[1].node is ElementNodeBase ed)
                {
                    //如果是这里能够获取到实例对象，直接把实例对象传递到接口中，如果找不到就是null
                    ed.variableTableInterface.SetVariable(list[1].name,dp.Value);
                    //保存一下数据指针，防止获取不到实例，导致就找不到实例了，
                    ed.dataPointerAssociation.AddDataPointer(list[1].name,dp);
                }else if(list[1].node is DataPointer dp1 && list[0].node is ElementNodeBase ed1)
                {
                    //如果是这里能够获取到实例对象，直接把实例对象传递到接口中，如果找不到就是null
                    ed1.variableTableInterface.SetVariable(list[0].name ,dp1.Value);
                    //保存一下数据指针，防止获取不到实例，导致就找不到实例了，
                    ed1.dataPointerAssociation.AddDataPointer(list[0].name, dp1);
                }
                else
                {
                    throw new Exception("变量赋值，但是发现多个元素");
                }

            }
            else if (list[0].node is VirtualNode vn)

            {//第一个节点是虚节点，后边无论多少个，就是通过虚节点的Out连接到下面的节点
                for (int i = 1; i < list.Count; i++)
                    vn.Connect((ElementNodeBase)list[i].node, list[0].name, list[1].name);
            }else
            {//第一个是图元节点，并且不是赋值操作了
                if (list.Count > 2)
                {//图元个数太多需要新建一个虚拟节点
                    VirtualNode test = new VirtualNode();
                    //第一个元素连接到虚拟节点
                    ((ElementNodeBase)list[0].node).Connect(test, list[0].name, "in");
                    for(int i = 1; i < list.Count; i++)
                    {
                        test.Connect(list[i].node, "out", list[i].name);
                    }
                }else if (list.Count == 2)
                {
                    ((ElementNodeBase)list[0].node).Connect(list[1].node, list[0].name, list[1].name);

                }
                else
                {
                    throw new Exception("只传入了一个元素");
                }
            }
            
        }


        /// <summary>
        /// 判断是否包含数据指针,如果包含数据指针，那么就需要进行赋值操作，并且元素就两个
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        private static bool IsContainDataPointer(List<(IGraphNode node, string name)> list)
        {
            var res = false;
            for(int i = 0; i < list.Count; i++)
            {
                if (list[i].node is DataPointer dp)
                {
                    res = true;
                    return res;
                }
            }
            return res;
        }

    }
    
}
